<?php
namespace Core\Libs\Registro;
/*
class JabezSingleton {

	public static $_arrayInstancias = array();
	public static $_arrayPropriedadesPadraoDasInstancias = array();
	//public static $_arrayConfigClasseInstanciada = array();
	public static $_arrayParams = array();
	public static $classeSingleton = TRUE;
	protected static $_classeSingleton = NULL;

	final public static function &carregarInstancia($arrayParametros) {

		extract(&$arrayParametros, EXTR_REFS & EXTR_OVERWRITE);
		$totalParams =& count(&$arrayParams);		

		if($reiniciarPropriedades !== FALSE) {

			$reiniciarPropriedades = TRUE;
		}

		if($classeSingleton !== TRUE || SINGLETON !== TRUE) {

			$ref = NULL;
			$instancia =& $ref;
			$instanciaRef =& $ref;
			$classeSingleton = FALSE;
		}

		else {

			$instancia =& self::$_arrayInstancias[$arrayParametros['idClasse']];
			$instanciaRef =& self::$_arrayInstancias['CoreReflectionClass'];
			$arrayTotal =& self::$_arrayPropriedadesPadraoDasInstancias[$idClasse]['total'];
		}

		if($instanciaRef === NULL || $instancia === NULL || !$classeSingleton) {

			if($instanciaRef === NULL || !$classeSingleton) {

				if($reflexao && $retorno) {

					$instanciaRef = new \ReflectionClass(&$classe);

					if(!$classeSingleton || $retorno === 'reflexao') {

						return $instanciaRef;
					}
				}

				elseif($reflexao) {

					$instanciaRef = new \ReflectionClass(&$classe);
					return;
				}
			}

			else {

				$goto = TRUE;
				goto getInstanciaRefConstruct;
			}

			setInstanciaRefConstruct:

			if($arrayParams !== TRUE && $totalParams) {

				try {

					$instancia = new \ReflectionClass(&$classe);
					$instancia = $instancia->newInstanceArgs(&$arrayParams);
				}

				catch(\Exception $e) {

					echo 'Construtor nao possui parametros ou nao existe, CLASSE: '.$classe;
					exit();
				}
			}

			else {

				try {

					$instancia = new $classe();
				}

				catch(\Exception $e) {

					echo 'Faltou Parametros para Construtor, CLASSE: '.$classe;
					exit();
				}
			}

			if($classeSingleton && $reiniciarPropriedades) {

				$arrayTotal =& count($instanciaRef->getProperties());

				if($idClasse !== 'ReflectionClass' && $arrayTotal) {

					$instanciaRef->__construct(&$classe);
					self::_adicionarPropriedadesPadraoDaInstancia(&$idClasse);
				}
			}
		}

		else {

			if($instanciaRef !== NULL) {

				getInstanciaRefConstruct:

				if($reflexao && $retorno) {

					$instanciaRef->__construct(&$classe);

					if(!$classeSingleton || $retorno === 'reflexao') {

						return $instanciaRef;
					}
				}

				elseif($reflexao) {

					$instanciaRef->__construct(&$classe);
					return;
				}

				if($goto === TRUE && $instancia === NULL) {

					$goto = NULL;
					goto setInstanciaRefConstruct;
				}
			}

			else {

				goto setInstanciaRefConstruct;
			}

			if($totalParams) {		

				if($idClasse !== 'ReflectionClass' && $arrayTotal && $reiniciarPropriedades) {

					self::_reiniciarPropriedadesDaInstancia(&$idClasse);
				}

				if($arrayParams !== TRUE) {

					call_user_func_array(array(&$instancia, '__construct'), &$arrayParams);
				}

				else {

					try {

						$instancia->__construct();
					}

					catch(\Exception $e) {

						echo 'Faltou Parametros para Construtor, CLASSE: '.$classe;
						exit();
					}						
				}
			}

			else {

				if($idClasse !== 'ReflectionClass' && $arrayTotal && $reiniciarPropriedades) {

					self::_reiniciarPropriedadesDaInstancia(&$idClasse);
				}
			}
		}

		unset($arrayParametros);

		if($retorno || !$classeSingleton) {

			return $instancia;
		}
	}

	final public static function &_adicionarPropriedadesPadraoDaInstancia(&$idClasse) {

		$instancia =& self::$_arrayInstancias[$idClasse];
		$instanciaRef =& self::$_arrayInstancias['CoreReflectionClass'];
		$arrayProps =& self::$_arrayPropriedadesPadraoDasInstancias[$idClasse]['propriedades'];
		$arrayPropriedades =& $instanciaRef->getProperties();

		foreach($arrayPropriedades as $propriedade) {

			$valorPropriedade =& $instanciaRef->getProperty($propriedade->getName());
			$valorPropriedade->setAccessible(TRUE);
			$valorPropriedade =& $valorPropriedade->getValue(&$instancia);

			if(!is_null(&$valorPropriedade)) {

				$arrayProps[$propriedade->getName()] = $valorPropriedade;
			}
		}

		if(!count(&$arrayProps)) {

			$arrayProps = array();
		}
	}

	final public static function &_reiniciarPropriedadesDaInstancia(&$idClasse) {

		$instancia =& self::$_arrayInstancias[$idClasse];
		$instanciaRef =& self::$_arrayInstancias['CoreReflectionClass'];
		$arrayPropriedades =& $instanciaRef->getProperties();

		foreach($arrayPropriedades as $propriedade) {

			$arrayNomesPropriedades[$propriedade->getName()] = NULL;
		}

		$arrayPropriedades =& array_merge(&$arrayNomesPropriedades, &self::$_arrayPropriedadesPadraoDasInstancias[$idClasse]['propriedades']);

		foreach($arrayPropriedades as $propriedade => $valor) {

			$recriarPropriedade =& $instanciaRef->getProperty($propriedade);
			$recriarPropriedade->setAccessible(TRUE);

			try {

				$recriarPropriedade->setValue(&$instancia, $valor);
			}

			catch(\Exception $e) {}
		}
	}
}
*/
class RegistroNameSpace extends JabezSingleton {
	
	private static $_arrayRegistrosDeNameSpaces = array();

	final public static function set_arrayRegistrosDeNameSpaces($array) {

		self::$_arrayRegistrosDeNameSpaces =& $array;
	}

	final public static function get_arrayRegistrosDeNameSpaces() {

		return self::$_arrayRegistrosDeNameSpaces;
	}

	final public static function &getCaminho($nameSpace) {

		return self::$_arrayRegistrosDeNameSpaces[$nameSpace]['local'];
	}

	final public static function &getDependencias($nameSpace) {

		return self::$_arrayRegistrosDeNameSpaces[$nameSpace]['dependencias'];
	}

	final public static function &adicionar($array) {

		self::$_arrayRegistrosDeNameSpaces =& array_merge_recursive(&self::$_arrayRegistrosDeNameSpaces, &$array);
	}

	final public static function &deletar($nameSpace, $deletarNameSpace = TRUE) {

		if($deletar) {

			unset(self::$_arrayRegistrosDeNameSpaces[$nameSpace]);
			self::$_arrayRegistrosDeNameSpaces =& self::$_arrayRegistrosDeNameSpaces;
		}

		else {

			unset(self::$_arrayRegistrosDeNameSpaces[$nameSpace]['dependencias']);
			self::$_arrayRegistrosDeNameSpaces =& self::$_arrayRegistrosDeNameSpaces;
		}
	}

	final public static function &reinicar() {

		self::$_arrayRegistrosDeNameSpaces = array();
	}

	final public static function &nameSpaceExiste($nameSpace) {

		return array_key_exists($nameSpace, &self::$_arrayRegistrosDeNameSpaces);
	}
}

class RegistroClasse extends RegistroNameSpace {

	//public static $new;

	final public function &parametros() {

		self::$_arrayParams =& func_get_args();

		return $this;
	}

	final public function &singleton($bool = TRUE) {

		self::$_classeSingleton =& $bool;

		return $this;
	}

	final public function &reiniciarPropriedades($bool = TRUE) {

		
	}

	final public static function &_detectarConfigDoCaminho($path, $idxInicial = FALSE, $subPath = FALSE, $abs = FALSE) {

		$path =& mb_strtolower(&$path);
		preg_match('/^[a-zA-Z0-9\_\-]+|(?<=(\)|\]))[a-zA-Z0-9\_\-]+/', &$path, &$match);
		$requisicao = $match[0];

		if($requisicao === 'plugins' || $requisicao === 'plugin') {

			$flag3 =& preg_match('/^((\(|\[)[a-z0-9\_\-\.\:]+(\)|\]))?plugin(s)?(\(|\[)[a-z0-9\_\-]+(\)|\])/i', &$path);

			if(!$flag3) {

				return array('pregPathRaiz' => 'nomePluginNull');
			}
		}

		elseif($requisicao === 'packages' || $requisicao === 'package') {

			$flag4 =& preg_match('/^((\(|\[)[a-z0-9\_\-\.\:]+(\)|\]))?package(s)?(\(|\[)[a-z0-9\_\-]+(\)|\])/i', &$path);

			if(!$flag4) {

				return array('pregPathRaiz' => 'nomePackageNull');
			}
		}

		//if($abs) {

			if(preg_match('/^(\(|\[)[a-zA-Z0-9\_\-\.\:]+(\)|\])/', &$path, &$match)) {

				$match[0] =& mb_substr(&$match[0], 1, -1);
				$path =& preg_replace('/^(\(|\[)'.$match[0].'(\)|\])/', '', &$path);
				$arrayIdxCaminhos =& preg_split('/\.|\:/', &$match[0]);
				$cArrayIdxCaminhos =& count(&$arrayIdxCaminhos);

				if($cArrayIdxCaminhos > 2) {

					$idxTipoCaminho =& $arrayIdxCaminhos[0];
					$idxTipoConteudoCaminho =& $arrayIdxCaminhos[1];
					$idxNomeCaminho =& $arrayIdxCaminhos[2];
					$idxPadrao = FALSE;

					if(empty($idxNomeCaminho)) {

						echo 'É necessário informar o nome do caminho adicionado, para localizar e carregar o arquivo. Tipo do Caminho: '.$idxTipoCaminho.'/Tipo do Conteúdo: '.$idxTipoConteudoCaminho.'/Nome do Caminho: NULL'.' <br> String utilizada: ('.$idxTipoCaminho.'.'.$idxTipoConteudoCaminho.'.'.')'.$path;
						exit();
					}
				}

				elseif($cArrayIdxCaminhos === 2) {

					$idxTipoCaminho =& $arrayIdxCaminhos[0];
					$idxTipoConteudoCaminho =& $arrayIdxCaminhos[1];
					$idxPadrao = TRUE;
				}

				else {

					$idxTipoCaminho =& $arrayIdxCaminhos[0];
					$idxTipoConteudoCaminho = 'class';
					$idxPadrao = TRUE;
				}

				$idxSubConfig = TRUE;
			}

			else {

				$idxTipoConteudoCaminho = 'class';
			}
		//}

		if(preg_match('/((?<=(\)|\])\:)|(?![a-zA-Z0-9\_\-]+(\)|\]))(?<=\:))[a-zA-Z0-9\_\-]+/', mb_strtolower(&$idxInicial), &$appModulo)) {

			$appModulo =& $appModulo[0];
			$adicionarIdxModulo = 1;
		}

		else {

			$appModulo = FALSE;
			$adicionarIdxModulo = 0;
		}

		if($subPath) {

			$flag =& preg_match_all('/(?<=\(|\[)[a-zA-Z0-9\_\-]+(\.|\:)?[a-zA-Z0-9\_\-]+(?=\)|\))/', &$path, &$match[0]);

			if($flag && $flag3) {

				$appRaiz =& $match[0][0][0];
				$nsRaiz = 'plugins';
				extract(self::carregarInicializador(array('appRaiz' => &$appRaiz, 'nsRaiz' => &$nsRaiz)), EXTR_REFS & EXTR_OVERWRITE);
				$replace = PLUGINS;				
				$pregPathRaiz = 0;
				$path = $appRaiz.preg_replace('/plugin(s)?(\(|\[)'.$appRaiz.'(\)|\])/i', '', &$path);

				if(count($match[0][0]) + $adicionarIdxModulo > 1 + $adicionarIdxModulo) {

					$flag = TRUE;
				}

				else {

					$flag = FALSE;
				}

				unset($match);
			}

			elseif($flag && $flag4) {

				$appRaiz =& $match[0][0][0];
				$nsRaiz = 'packages';
				extract(self::carregarInicializador(array('appRaiz' => &$appRaiz, 'nsRaiz' => &$nsRaiz)), EXTR_REFS & EXTR_OVERWRITE);
				$replace = PACKAGES;
				$pregPathRaiz = 1;
				$path = $appRaiz.preg_replace('/package(s)?(\(|\[)'.$appRaiz.'(\)|\])/i', '', &$path);

				if(count($match[0][0]) + $adicionarIdxModulo > 1 + $adicionarIdxModulo) {

					$flag = TRUE;
				}

				else {

					$flag = FALSE;
					unset($match);
				}
			}

			else {

				$pregPathRaiz =& $requisicao;

				if($pregPathRaiz === 'jabez-php' || $pregPathRaiz === 'core') {

					$appRaiz = 'jabez';
					$nsRaiz = 'core';
					$appCore = JABEZ_DIR_CORE;
					$replace = JABEZ;
				}

				else {

					$appRaiz = $nsRaiz = $pregPathRaiz;
					$appCore = PROJETO_DIR_CORE;
					$replace = PATH_RAIZ.$appRaiz.DS;
				}

				$pregPathRaiz = 3;
			}

			if($flag) {

				preg_match_all('/(?<!\(|\[)[a-zA-Z0-9\_\-]+(?=\(|\[)(?!:)/', &$path, &$match[2]);
				preg_match_all('/(?<=\(|\[)[a-zA-Z0-9\_\-]+/', &$path, &$match[3]);
				$match =& array_combine(&$match[3][0], &$match[2][0]);

				foreach($match as $i => $v) {

					$path =& preg_replace('/'.$v.'(\(|\[)'.$i.'(\)|\])/i', $i, &$path, 1);
				}

				$match =& array_values(&$match);
			}

			elseif($pregPathRaiz > 2) {

				$pregPathRaiz = 4;
				unset($match);
			}
		}

		else {

			$pregPathRaiz =& $requisicao;

			if($pregPathRaiz == 'jabez-php' || $pregPathRaiz == 'core') {

				$appRaiz = 'jabez';
				$nsRaiz = 'core';
				$appCore = JABEZ_DIR_CORE;
				$replace = JABEZ;
			}

			else {

				$appRaiz = $nsRaiz = $pregPathRaiz;
				$appCore = PROJETO_DIR_CORE;
				$replace = PROJETO;
			}

			$pregPathRaiz = 4;
			unset($match);
		}

		if($appModulo) {

			extract(self::carregarInicializador(array('nsRaiz' => &$nsRaiz, 'appCore' => &$appCore, 'appRaiz' => &$appRaiz, 'appModulo' => &$appModulo, 'replace' => &$replace)), EXTR_REFS & EXTR_OVERWRITE);
		}

		return array('appCore' => &$appCore, 'appRaiz' => &$appRaiz, 'nsRaiz' => &$nsRaiz, 'nsAppModulo' => &$nsAppModulo, 'appModulo' => &$appModulo, 'appCoreModulo' => &$appCoreModulo, 'path' => &$path, 'pregPathRaiz' => &$pregPathRaiz, 'match' => &$match, 'replace' => &$replace, 'idxTipoCaminho' => &$idxTipoCaminho, 'idxTipoConteudoCaminho' => &$idxTipoConteudoCaminho, 'idxNomeCaminho' => &$idxNomeCaminho, 'idxSubConfig' => &$idxSubConfig, 'idxPadrao' => &$idxPadrao);
	}

	final public static function &_construirConfigDoCaminho($path, $arrayCaminhos = FALSE, $retorno = 'array') {

		if($path{0} == '.') {

			$path =& mb_substr(&$path, 1);
			$abs = TRUE;
		}

		else {

			$abs = FALSE;
		}

		if(strpos(&$path, '::') !== FALSE) {
\Core\Uses\Dump($path);
			$arrayPath =& explode('::', &$path);
			$auxClsNome =& $arrayPath[1];
			$auxPath =& $arrayPath[0];

			if(preg_match('/\(|\[|\:/', &$auxPath)) {

				if(preg_match('/^((\(|\[)[a-zA-Z0-9\_\-\.\:]+(\)|\]))/', &$auxPath, &$match)) {

					$auxPath = $arrayPath[0] = preg_replace('/^(\(|\[)'.$match[0].'(\)|\])/', str_replace('.', ':', &$match[0]), &$auxPath);
				}

				$arrayPath =& explode('.', &$arrayPath[0]);
				$clsNome =& $auxClsNome;
				$aqvNome =& $arrayPath[count(&$arrayPath) - 1];
				//echo $arrayPath[0];
				extract(self::_detectarConfigDoCaminho(&$auxPath, &$arrayPath[0], TRUE, &$abs), EXTR_REFS & EXTR_OVERWRITE);
			}

			else {

				$arrayPath =& explode('.', &$arrayPath[0]);
				$clsNome =& $auxClsNome;
				$aqvNome =& $arrayPath[count(&$arrayPath) - 1];
				extract(self::_detectarConfigDoCaminho(&$auxPath, FALSE, &$abs), EXTR_REFS & EXTR_OVERWRITE);
			}

			$arrayPath =& explode('.', &$path);
		}

		else {

			if(preg_match('/\(|\[|\:/', &$path)) {

				if(preg_match('/^((\(|\[)[a-zA-Z0-9\_\-\.\:]+(\)|\]))/', &$path, &$match)) {

					$path = preg_replace('/^(\(|\[)'.$match[0].'(\)|\])/', str_replace('.', ':', &$match[0]), &$path);
				}

				$arrayPath =& explode('.', &$path);
				$aqvNome = $clsNome = $arrayPath[count(&$arrayPath) - 1];				
				extract(self::_detectarConfigDoCaminho(&$path, &$arrayPath[0], TRUE), EXTR_REFS & EXTR_OVERWRITE);
			}

			else {

				$arrayPath =& explode('.', &$path);
				$aqvNome = $clsNome = $arrayPath[count(&$arrayPath) - 1];
				extract(self::_detectarConfigDoCaminho(&$path), EXTR_REFS & EXTR_OVERWRITE);
			}

			$arrayPath =& explode('.', &$path);
		}

		$totalParams =& count(&$arrayPath);

		if($totalParams > 1) {

			if($pregPathRaiz === 'nomePluginNull' || $pregPathRaiz === 'nomePackageNull') {

				echo 'Nome do plugin/package não informado, verifique as informações passadas no método';
				exit();
			}

			$auxAppCore = $appCore;

			foreach($arrayPath as $i => $path) {

				$auxPath = $path;

				if($i === 1) {

					if(preg_match('/(?<=(\(|\[|\:))[^a-zA-Z0-9\_\-]+/', $path)) {

						echo 'Sub diretório: ['.$path.'] informado não contém caracteres válidos e não foi possível encontrá-lo nos caminhos adicionais, verifique o nome e tente novamente.';
						exit();
					}

					else {

						$tMatch =& count($match);
						if($idxSubConfig) {

							$nomeSubCaminho = $idxNomeCaminho;
							//$replace .= $appRaiz.DS;
							//echo $pregPathRaiz;

							//alterado 16/02/2011 - Reg: 4
							//echo \Core\Uses\Dump($idxPadrao2);
							if($pregPathRaiz !== 4) {

								$replace .= $appRaiz.DS;
							}
						}

						else {

							$tMatch =& count($match);
							$nomeSubCaminho = $path;
							//$idxTipoConteudoCaminho = 'class';

							if($tMatch > 0 && $tMatch < 3) {

								$idxTipoCaminho =& $match[$tMatch - 1];
							}

							else {

								$idxTipoCaminho = $path;
								$idxPadrao = TRUE;
							}
						}

						if($idxTipoCaminho !== $path) {

							$nomeSubCaminho = $path;
						}

						if(!$idxPadrao) {

							if(!$caminhosCarregados && !is_array(&$arrayCaminhos)) {

								$arrayCaminhos = \Core\Libs\Extender\Diretorio::getCaminhos('array');
								$caminhosCarregados = TRUE;
							}

							if($pregPathRaiz < 3) {

								$auxNsRaiz = $nsRaiz;
								$replace .= $appRaiz.DS;
								$nsRaiz .= DS.$appRaiz;
								$stringMontagemArrayCaminhos = '$arrayCaminhos[\''.$auxNsRaiz.'\'][\''.$appRaiz.'\']';

								if($pregPathRaiz === 0) {

									$auxAppRaiz = DIR_EXTENSIONS.DS.DIR_PLUGINS.DS;
								}

								elseif($pregPathRaiz === 1) {

									$auxAppRaiz = DIR_EXTENSIONS.DS.DIR_PACKAGES.DS;
								}
							}

							else {

								$stringMontagemArrayCaminhos = '$arrayCaminhos[\''.$nsRaiz.'\']';
							}

							if($appModulo) {

								$stringMontagemArrayCaminhos .= '[\'modules\'][\''.$appModulo.'\']';
								$nsModulo = 'Modules\\'.$appModulo.'\\';
							}

							$stringMontagemArrayCaminhos .= '[\''.$auxAppCore.'\'][\''.$idxTipoCaminho.'\']';

							eval(
								'$pathReal =& '.$stringMontagemArrayCaminhos.'[\'paths\'][\''.$nomeSubCaminho.'\'];'.
								'$extAqv =& '.$stringMontagemArrayCaminhos.'[\'contents\'][\''.$idxTipoConteudoCaminho.'\'][\'file\'];'.
								'$aqvTc =& '.$stringMontagemArrayCaminhos.'[\'contents\'][\''.$idxTipoConteudoCaminho.'\'][\'type\'];'.
								'$tipoExt =& '.$stringMontagemArrayCaminhos.'[\'contents\'][\''.$idxTipoConteudoCaminho.'\'][\'ext\'];'
								);
						}

						else {

							$idxTipoCaminho = $path;
							$auxPathReal = PATH_RAIZ;
							$appCore .= DS;
							$idxPadrao = TRUE;

							//if($idxTipoConteudoCaminho !== 'interface') {

								//$idxTipoConteudoCaminho = 'class';
							//}

							if(!$caminhosCarregados) {

								$arrayCaminhos =& \Core\Libs\Extender\Diretorio::getExtensoesPadrao('array');
								$extAqv =& $arrayCaminhos[$idxTipoCaminho][$idxTipoConteudoCaminho]['file'];
								$aqvTc =& $arrayCaminhos[$idxTipoCaminho][$idxTipoConteudoCaminho]['type'];
								$tipoExt =& $arrayCaminhos[$idxTipoCaminho][$idxTipoConteudoCaminho]['ext'];
								$caminhosCarregados = TRUE;
							}

							if($pregPathRaiz < 3) {

								$auxNsRaiz = $nsRaiz;
								$replace .= $appRaiz.DS;
								$nsRaiz .= DS.$appRaiz;

								if($pregPathRaiz === 0) {

									$auxAppRaiz = DIR_EXTENSIONS.DS.DIR_PLUGINS.DS;
									$pathReal = PLUGINS.$appRaiz.DS.$appCore.$idxTipoCaminho.DS;
									$appCore .= DS;
								}

								elseif($pregPathRaiz === 1) {

									$auxPathReal = PACKAGES;
									$auxAppRaiz = DIR_EXTENSIONS.DS.DIR_PACKAGES.DS;
									$pathReal = PACKAGES.$appRaiz.DS.$appCore.DS.$idxTipoCaminho.DS;
								}
							}

							elseif($pregPathRaiz === 4) {

								if($appModulo) {

									$pathReal = PATH_RAIZ.$appRaiz.DS.$appCore;
								}

								else {

									$pathReal = PATH_RAIZ.$appRaiz.DS.$appCore.$idxTipoCaminho.DS;
								}								
							}

							else {

								$pathReal = PATH_RAIZ.$appRaiz.DS.$appCore.$idxTipoCaminho.DS;
							}

							if($appModulo) {

								$pathReal .= MODULES.$appModulo.DS.$appCoreModulo.DS.$idxTipoCaminho.DS;
								$nsModulo = 'Modules\\'.$appModulo.'\\';
							}
						}
						
						/*
echo $auxPathReal;
						if(!preg_match('/'.addslashes($auxPathReal).'/', &$pathReal)) {

							$pathReal = $auxPathReal;
						}
*/
						if($abs) {

							if(!$idxTipoCaminho || !$idxTipoConteudoCaminho || preg_match('/[^a-zA-Z0-9\_\-]/', &$path)) {

								echo 'Especificação do caminho absoluto incorreta/incompleta, verifique a chamada ao metodo';
								exit();
							}

							$idxTipoCaminho .= DS;
							$appCore = '';
							$pathReal = $path.DS;
						}

						else {

							$idxTipoCaminho .= '\\';
							$flag =& preg_match('/'.addslashes(&$replace).'/', &$pathReal);
//\Core\Uses\Dump($replace);
							if($flag) {

								$pathReal =& preg_replace('/'.addslashes(&$replace).'/', '', &$pathReal);
								$appCore = '';
							}

							else {

								echo 'Especificação do caminho não é a mesmo do diretório ['.$appRaiz.'], verifique a chamada ao método';
								exit();
							}
						}

						if($extAqv !== NULL) {

							$tipoRq = $extAqv;
							$tipoPath = $pathReal;
						}

						else {

							$tipoRq = '';
							$tipoPath = $pathReal;
							$aqvTc =& str_replace('.', '', &$aqvTc);						
						}
					}
				}

				elseif($i > 1 && $i < ($totalParams - 1)) {

					$auxPath = preg_replace('/((?<=[a-z0-9])[A-Z0-9]{1,1})/', '-\1', &$auxPath);
					$appMdPath .= $path.DS;

					if($nsTipoPath !== $auxPath.DS || $adicionarPath) {

						$mdUpPath .= $auxPath.DS;					
					}

					else {

						$adicionarPath = TRUE;
					}
				}
			}

			$aqvExt = $tipoRq.$aqvTc.$tipoExt;
			$aqvNomeCmp = $aqvNome.$aqvExt;
			$nsNome =& str_replace('-', '', preg_replace_callback('/(?<=\\|\\\|\\\\|\-)[a-z]{1,1}/', create_function('$match', 'return strtoupper($match[0]);'), '\\'.$nsRaiz.'\\'.$nsModulo.$idxTipoCaminho.$mdUpPath.$aqvNome.'\\'.$clsNome));
			//echo \Core\Uses\Dump($nsNome);
			$aqvPathCmp = PATH_RAIZ.$auxAppRaiz.$appRaiz.DS.$appCore.$tipoPath.$appMdPath.$aqvNomeCmp;
			//echo \Core\Uses\Dump($aqvPathCmp);
			$clsId =& sha1($aqvPathCmp.DS.$clsNome);
		}

		else {

			$nsNome = $clsId = $clsNome = $aqvPathCmp = $path;
		}

		unset($arrayCaminhos);

		if($retorno === 'array') {

			return array('idClasse' => &$clsId, 'caminho' => &$aqvPathCmp, 'nameSpace' => &$nsNome, 'nomeArquivo' => &$aqvNomeCmp, 'extArquivo' => &$extAqv, 'totalParams' => &$totalParams);
		}

		elseif($retorno === 'caminho') {

			return $aqvPathCmp;
		}
	}

	final public static function &procurarCaminhoDoArquivoNoNameSpace($nameSpace, $tipo = NULL, $tipoRestrito = FALSE) {

		$auxNameSpace = $nameSpace;

		if($nameSpace{0} === '\\') {

			$nameSpace =& explode('\\', mb_substr(&$nameSpace, 1));
		}

		else {

			$nameSpace =& explode('\\', &$nameSpace);
		}

		$tNameSpace =& count($nameSpace);
		$nomeDaClasseOuInterface =& $nameSpace[$tNameSpace - 1];
		$arrayNameSpace = array();
		unset($nameSpace[$tNameSpace - 1]);

		if($nameSpace[0] === 'Core' || $nameSpace[0] === 'JabezPhp') {

			$requisicao = $nameSpace[0];
			$stringGetObjeto = $requisicao;
			$tipoDoCaminho = $nameSpace[1];
			$stringLocaisDosDiretoriosExtras = '[\'core\']';
			unset($nameSpace[0]);
		}

		elseif($nameSpace[0] === 'Plugins' || $nameSpace[0] === 'Packages') {

			$requisicao = $nameSpace[0];
			$tipoDoCaminho = $nameSpace[2];
			$stringGetObjeto = $requisicao.'('.$nameSpace[1].')';
			$stringLocaisDosDiretoriosExtras = '[\'plugins\'][\''.$nameSpace[1].'\']';
			unset($nameSpace[0], $nameSpace[1]);
		}

		else {

			$requisicao = $nameSpace[0];
			$tipoDoCaminho = $nameSpace[1];
			$stringGetObjeto = $requisicao;
			$stringLocaisDosDiretoriosExtras = '[\''.$nameSpace[0].'\']';
			unset($nameSpace[0]);
		}

		if($nameSpace[1] === 'Modules' || $nameSpace[2] === 'Modules') {

			if($requisicao === 'Packages') {

				echo 'Packages não podem conter módulos. Package: ['.$appRaiz.']';
				exit();
			}

			else {

				if($nameSpace[1] === 'Modules') {

					$tipoDoCaminho =& $nameSpace[3];
					$appModulo =& $nameSpace[2];
					unset($nameSpace[1], $nameSpace[2]);
				}

				else {

					$tipoDoCaminho =& $nameSpace[4];
					$appModulo =& $nameSpace[3];
					unset($nameSpace[2], $nameSpace[3]);
				}

				$stringLocaisDosDiretoriosExtras .= '[\'modules\'][\''.$appModulo.'\'][\'app\'][\''.mb_strtolower(&$tipoDoCaminho).'\']';
				$stringGetObjeto .= ':'.$appModulo;
			}
		}

		else {

			$stringLocaisDosDiretoriosExtras .= '[\'app\'][\''.mb_strtolower(&$tipoDoCaminho).'\']';
		}

		$auxStringGetObjeto = $stringGetObjeto;

		foreach($nameSpace as $parte) {

			$stringGetObjeto .= '.'.$parte;
		}

		if(!preg_match('/'.$stringGetObjeto.'$/', &$nomeDaClasseOuInterface)) {

			$stringGetObjeto .= '::'.$nomeDaClasseOuInterface;
		}

		if(!empty($tipo)) {

			if($tipo === 'implements' && $tipoRestrito) {

				$tipo = ':interface';
			}

			elseif($tipo === 'extends' && $tipoRestrito) {

				$tipo = ':class';
			}

			else {

				$tipo = ':'.$tipo;
			}

			$stringGetObjeto = '('.$tipoDoCaminho.$tipo.')'.$stringGetObjeto;
		}

		$caminho = self::_construirConfigDoCaminho(&$stringGetObjeto, FALSE, 'caminho');
		$stringGetObjeto = NULL;

		if(\Core\Uses\ChecarArquivo($caminho) && self::checkNamespacesInFile(&$caminho, &$auxNameSpace)) {

			return $caminho;
		}

		else {

			$arrayCaminhos = \Core\Libs\Extender\Diretorio::getCaminhos('array');
			eval('$arrayCaminhosAdicionais = $arrayCaminhos'.$stringLocaisDosDiretoriosExtras.'[\'paths\'];');

			if(!is_array(&$arrayCaminhosAdicionais)) {

				$arrayCaminhosAdicionais = array();
			}

			foreach($arrayCaminhosAdicionais as $idx => $path) {

				$stringGetObjeto = $auxStringGetObjeto;
				$cNameSpace = 0;

				foreach($nameSpace as $parte) {

					if($cNameSpace === 0) {

						if(!empty($tipo)) {

							if($tipo === 'implements' && $tipoRestrito) {

								$tipo = ':interface';
							}

							elseif($tipo === 'extends' && $tipoRestrito) {

								$tipo = NULL;
							}

							else {

								$tipo = ':'.$tipo;
							}

							$stringGetObjeto = '('.$tipoDoCaminho.$tipo.':'.$parte.')'.$stringGetObjeto;
						}

						$stringGetObjeto .= '.'.$parte.'('.$idx.')';
					}

					else {

						$stringGetObjeto .= '.'.$parte;
					}

					$cNameSpace++;
				}

				$stringGetObjeto .= '::'.$nomeDaClasseOuInterface;
				$caminho =& self::_construirConfigDoCaminho(&$stringGetObjeto, $arrayCaminhos, 'caminho');
				$stringGetObjeto = NULL;

				if(\Core\Uses\ChecarArquivo($caminho) && self::checkNamespacesInFile(&$caminho, &$auxNameSpace)) {

					unset($arrayCaminhosAdicionais, $arrayCaminhos);
					return $caminho;
				}

				else {

					return FALSE;
				}
			}
		}
	}

	final public static function &checkNamespacesInFile($caminho, $nameSpace, $idxToken = 0, $retorno = FALSE) {

		if(!is_array(&$caminho)) {

			$arrayConteudoDoArquivo =& token_get_all(file_get_contents(&$caminho));
		}

		else {

			$arrayConteudoDoArquivo =& $caminho;
		}

		while($arrayConteudoDoArquivo[$idxToken][0] !== T_CLOSE_TAG) {

			if($arrayConteudoDoArquivo[$idxToken][0] === T_NAMESPACE) {

				$idx = 2;

				while($arrayConteudoDoArquivo[$idxToken + $idx] !== ';') {

					$nameSpaceEncontrado .= $arrayConteudoDoArquivo[$idxToken + $idx][1];
					$idx++;
				}

				$auxNameSpaceEncontrado = $nameSpaceEncontrado;
			}

			elseif($arrayConteudoDoArquivo[$idxToken][0] === T_CLASS || $arrayConteudoDoArquivo[$idxToken][0] === T_INTERFACE || $arrayConteudoDoArquivo[$idxToken][0] === T_ABSTRACT) {

				if($nameSpace === '\\'.$auxNameSpaceEncontrado.'\\'.$arrayConteudoDoArquivo[$idxToken + 2][1] || $nameSpace === $auxNameSpaceEncontrado.'\\'.$arrayConteudoDoArquivo[$idxToken + 2][1]) {

					if($retorno === 'source') {

						return array('arrayConteudoDoArquivo' => &$arrayConteudoDoArquivo, 'idxToken' => $idxToken + 2, 'retorno' => TRUE);
					}

					unset($arrayConteudoDoArquivo);
					return TRUE;
				}
			}

			$nameSpaceEncontrado = NULL;
			$idxToken++;
		}

		unset($arrayConteudoDoArquivo);

		if($retorno === 'source') {

			return array('retorno' => FALSE);
		}

		return FALSE;
	}
/*
	final public static function &procurarNameSpacesDeClassesExternasNoArquivo($caminho, $nameSpace = NULL, $idxToken = 0, $continuar = TRUE) {

		if(!is_array(&$caminho)) {

			$arrayConteudoDoArquivo =& token_get_all(file_get_contents(&$caminho));
		}

		else {

			$arrayConteudoDoArquivo =& $caminho;
		}

		if((!empty($nameSpace) || !$nameSpace) && $nameSpace != NULL) {

			extract(self::checkNamespacesInFile(&$arrayConteudoDoArquivo, &$nameSpace, 0, 'source'), EXTR_REFS & EXTR_OVERWRITE);

			if($retorno === FALSE) {

				return FALSE;
			}

			$continuar = FALSE;
		}

		while($arrayConteudoDoArquivo[$idxToken][0] !== T_CLOSE_TAG) {

			$idx = 0;

			if($arrayConteudoDoArquivo[$idxToken][0] === T_EXTENDS) {

				$possuiNameSpace = TRUE;

				if($arrayConteudoDoArquivo[$idxToken - 4][0] !== T_INTERFACE) {

					$arrayTiposDeNameSpaces[] = 'extends';
				}

				else {

					$arrayTiposDeNameSpaces[] = 'implements';
				}
			}

			elseif($arrayConteudoDoArquivo[$idxToken][0] === T_IMPLEMENTS) {

				$possuiNameSpace = TRUE;
				$arrayTiposDeNameSpaces[] = 'implements';
			}

			if($possuiNameSpace) {

				$idx = 2;

				while($arrayConteudoDoArquivo[$idxToken + $idx] !== '{') {

					if($arrayConteudoDoArquivo[$idxToken + $idx][0] !== T_IMPLEMENTS && $arrayConteudoDoArquivo[$idxToken + $idx] !== ',') {

						$nameSpacesClassePaiOuInterface .= $arrayConteudoDoArquivo[$idxToken + $idx][1];
					}

					elseif($arrayConteudoDoArquivo[$idxToken + $idx][0] === T_IMPLEMENTS || $arrayConteudoDoArquivo[$idxToken + $idx] === ',') {

						$arrayTiposDeNameSpaces[] = 'implements';
					}

					$idx++;
				}

				$possuiNameSpace = FALSE;

				if(!$continuar) {

					break;
				}
			}

			$idxToken += $idx + 1;				
		}

		unset($arrayConteudoDoArquivo);

		if(preg_match('/[\t\v\r\n\ ]+/', &$nameSpacesClassePaiOuInterface)) {

			return array_combine(preg_split('/[\t\v\r\n\ ]+/', preg_replace('/^[\t\v\r\n\ ]+|[\t\v\r\n\ ]+$/', '', &$nameSpacesClassePaiOuInterface)), &$arrayTiposDeNameSpaces);
		}

		if(!empty($nameSpacesClassePaiOuInterface)) {

			return array_combine(array($nameSpacesClassePaiOuInterface), &$arrayTiposDeNameSpaces);
		}

		return FALSE;
	}
*/
	final public static function &carregarInicializador($parametros) {

		extract(&$parametros, EXTR_REFS & EXTR_OVERWRITE);

		if($appModulo) {

			try {

				if($nsRaiz === 'plugins') {

					\Core\Uses\IncluirArquivo($replace.$appRaiz.DS.$appCore.DS.MODULES.$appModulo.DS.'config'.DS.'Inicializador.ini.php');
					$appCoreModulo = \Core\Uses\Ler('Plugin.'.$appRaiz.'.Module.'.$appModulo.'.principal.diretorio.core');
				}

				elseif($nsRaiz === 'packages') {

					echo 'Packages não podem conter módulos. Package: ['.$appRaiz.']';
					exit();
				}

				else {

					\Core\Uses\IncluirArquivo($replace.$appCore.DS.MODULES.$appModulo.DS.'config'.DS.'Inicializador.ini.php');

					if(empty($nsRaiz)) {

						$appCoreModulo = \Core\Uses\Ler($appRaiz.'.Module.'.$appModulo.'.principal.diretorio.core');
					}

					else {

						$appCoreModulo = \Core\Uses\Ler($nsRaiz.'.Module.'.$appModulo.'.principal.diretorio.core');
					}
				}

				$path =& preg_replace('/\:'.$appModulo.'/', '', &$path, 1);

				return array('appCoreModulo' => &$appCoreModulo);
			}

			catch(\Exception $e) {

				if($nsRaiz !== 'plugins' || $nsRaiz !== 'packages') {

					$appRaiz = '';
				}

				else {

					$appRaiz .= DS;
				}

				if(\Core\Uses\ChecarArquivo($replace.$appRaiz.$appCore.DS.MODULES.$appModulo.DS.'config'.DS.'Inicializador.ini.php')) {

					echo 'Erro no arquivo inicializador do MÓDULO: ['.$appModulo.']. Verifique o conteúdo do arquivo.';
					exit();
				}

				else {

					echo 'Erro incluir arquivo de configuração do MÓDULO: ['.$appModulo.']';
					exit();
				}
			}
		}

		else {

			if($nsRaiz === 'core' || $nsRaiz === 'jabez-php') {

			}

			elseif($nsRaiz === 'plugins') {

				$localDoArquivo = PLUGINS.$appRaiz.DS;
				$localDoAppCore = 'Plugin.'.$appRaiz.'.principal.diretorio.core';
				$auxAppCore = PLUGIN_DIR_CORE;
				$tipo = 'Plugin';
			}

			elseif($nsRaiz === 'packages') {

				$localDoArquivo = PACKAGES.$appRaiz.DS;
				$localDoAppCore = 'Package.'.$appRaiz.'.principal.diretorio.core';
				$auxAppCore = PACKAGE_DIR_CORE;
				$tipo = 'Package';
			}

			else {

			}

			try {

				\Core\Uses\IncluirArquivo($localDoArquivo.'config'.DS.'Inicializador.ini.php');
				$appCore = \Core\Uses\Ler($localDoAppCore);

				if(empty($appCore)) {

					$appCore = $auxAppCore;
				}
			}

			catch(\Exception $e) {

				if(\Core\Uses\ChecarArquivo($localDoArquivo.'config'.DS.'Inicializador.ini.php')) {

					echo 'Erro no arquivo inicializador do '.$tipo.': ['.$appRaiz.']. Verifique o conteúdo do arquivo.';
					exit();
				}

				else {

					echo 'Erro incluir arquivo de configuração do '.$tipo.': ['.$appRaiz.']';
					exit();
				}
			}

			return array('appCore' => &$appCore);
		}
	}

	final public static function &_incluirRecursivamenteArquivosDeClassesOuInterfacesExternas($caminho, $nameSpace = NULL, $continuar = FALSE, $arrayArquivosParaCarregar = NULL) {

		$arrayArquivosParaCarregar[0] =& self::procurarNameSpacesDeClassesExternasNoArquivo(&$caminho, NULL, 0, $continuar);
		$arrayNameSpacesChecados = array();
		$arrayDependencias = array();
		$chave = key($arrayArquivosParaCarregar[0]);
		$tipoDaChave = $arrayArquivosParaCarregar[0][$chave];
		$chaveInicial = $chave;
		$tipoDaChaveInicial = $tipoDaChave;
		$arrayCaminhosDosArquivosUtilizados['nameSpaces']['internos'] = array();
		$arrayCaminhosDosArquivosUtilizados['nameSpaces']['externos'] = array();
		$carregar = TRUE;
		$idx[0] = 1;

		if(is_array($arrayArquivosParaCarregar[0])) {

			$arrayDependencias[$nameSpace]['dependencias'] = $arrayArquivosParaCarregar[0];
		}

		while(TRUE) {

			if($carregar) {

				$local = self::procurarCaminhoDoArquivoNoNameSpace($chave, $tipoDaChave, TRUE);
				$arrayArquivosParaCarregar[$idx[0]] = self::procurarNameSpacesDeClassesExternasNoArquivo($local, NULL, 0, TRUE);

				if(is_array($arrayArquivosParaCarregar[$idx[0]])) {

					$arrayDependencias[$chave]['dependencias'] = $arrayArquivosParaCarregar[$idx[0]];

					foreach($arrayArquivosParaCarregar[$idx[0]] as $idx[1] => $idx[2]) {

						$extLocal = self::procurarCaminhoDoArquivoNoNameSpace($idx[1], $idx[2], TRUE);

						if($local === $extLocal) {

							$arrayCaminhosDosArquivosUtilizados['nameSpaces']['internos'][$idx[1]] = array('local' => $local, 'tipo' => $idx[2]);
						}

						else {

							$arrayCaminhosDosArquivosUtilizados['nameSpaces']['externos'][$idx[1]] = array('local' => $extLocal, 'tipo' => $idx[2]);
							$arrayCaminhosDosArquivosUtilizados['nameSpaces']['externos'][$chave] = array('local' => $local, 'tipo' => $tipoDaChave);
						}
					}

					reset($arrayArquivosParaCarregar[$idx[0]]);
				}

				else {

					$arrayCaminhosDosArquivosUtilizados['nameSpaces']['externos'][$chave] = array('local' => $local, 'tipo' => $tipoDaChave);
				}
			}

			if(is_array($arrayArquivosParaCarregar[$idx[0]])) {

				$chave = key($arrayArquivosParaCarregar[$idx[0]]);
				$tipoDaChave = $arrayArquivosParaCarregar[$idx[0]][$chave];
				$flagNameSpaceInterno = array_key_exists($chave, &$arrayCaminhosDosArquivosUtilizados['nameSpaces']['internos']);

				if(!$flagNameSpaceInterno && !array_key_exists($chave, &$arrayNameSpacesChecados)) {

					$arrayNameSpacesChecados[$chave] = $tipoDaChave;
					$carregar = TRUE;
				}

				else {

					if((count($arrayArquivosParaCarregar[$idx[0]])) > 1) {

						unset($arrayArquivosParaCarregar[$idx[0]][$chave]);
					}

					else {

						unset($arrayArquivosParaCarregar[$idx[0]]);
						$flagNaoRetornarIdx = TRUE;
					}

					$carregar = FALSE;
					continue;
				}
			}

			elseif(!$arrayArquivosParaCarregar[$idx[0]]) {

				if($idx[0] < 1) {

					$idx[0] = 1;
				}

				if(count($arrayArquivosParaCarregar[$idx[0] - 1]) > 1) {

					if(!$flagNaoRetornarIdx) {

						unset($arrayArquivosParaCarregar[$idx[0]], $arrayArquivosParaCarregar[$idx[0] - 1][$chave]);
						
					}

					else {

						unset($arrayArquivosParaCarregar[$idx[0]]);
					}

					$idx[0] -= 1;
					$flagNaoRetornarIdx = FALSE;
				}

				else {

					if(!$flagNaoRetornarIdx) {

						unset($arrayArquivosParaCarregar[$idx[0]], $arrayArquivosParaCarregar[$idx[0] - 1], $arrayArquivosParaCarregar[$idx[0] - 2][$chave]);
					}
					
					else {

						unset($arrayArquivosParaCarregar[$idx[0]], $arrayArquivosParaCarregar[$idx[0] - 2][$chave]);
					}

					$idx[0] -= 2;
					$flagNaoRetornarIdx = FALSE;
				}

				if($idx[0] < 0) {

					$idx[0] = 0;
				}

				if(!array_key_exists($chave, &$arrayNameSpacesChecados) && !array_key_exists($chave, &$arrayCaminhosDosArquivosUtilizados['nameSpaces']['internos'])) {

					$chave = key($arrayArquivosParaCarregar[$idx[0]]);
					$tipoDaChave = $arrayArquivosParaCarregar[$idx[0]][$chave];
					$arrayNameSpacesChecados[$chave] = $tipoDaChave;
					$carregar = TRUE;
				}

				elseif(is_array(&$arrayArquivosParaCarregar[0])) {

					$chave = key($arrayArquivosParaCarregar[$idx[0]]);
					$tipoDaChave = $arrayArquivosParaCarregar[$idx[0]][$chave];

					if(!array_key_exists($chave, &$arrayCaminhosDosArquivosUtilizados['nameSpaces']['internos'])) {

						if(!count($arrayArquivosParaCarregar[0]) && !$carregar) {

							$arrayNameSpacesChecados =& array_reverse($arrayNameSpacesChecados);
							break;
						}

						if(!array_key_exists($chave, &$arrayNameSpacesChecados)) {

							$arrayNameSpacesChecados[$chave] = $tipoDaChave;
							$carregar = TRUE;
						}
					}

					else {

						$carregar = FALSE;
						continue;
					}

					if($idx[0] === 0) {

						$auxChave = $chave;
						$auxTipoDaChave = $tipoDaChave;
						unset($arrayArquivosParaCarregar[0][$chave]);
						$chave = key($arrayArquivosParaCarregar[0]);
						$tipoDaChave = $arrayArquivosParaCarregar[0][$chave];
						$carregar = TRUE;

						if(!empty($chave) || $chave != NULL) {

							$arrayNameSpacesChecados[$chave] = $tipoDaChave;
						}

						else {

							$chave = $auxChave;
							$tipoDaChave = $auxTipoDaChave;
							$arrayNameSpacesChecados[$chave] = $tipoDaChave;
						}
					}
				}

				else {

					$carregar = FALSE;
				}
			}

			if(!count($arrayArquivosParaCarregar[0]) && !$carregar) {

				$arrayNameSpacesChecados =& array_reverse($arrayNameSpacesChecados);
				break;
			}

			$idx[0]++;
		}

		unset($arrayNameSpacesChecados[$chaveInicial]);
		$arrayNameSpacesChecados = $arrayNameSpacesChecados + array($chaveInicial => $tipoDaChaveInicial) + array($nameSpace => 'class');
		$arrayTempDiretorios =& array_merge_recursive(&$arrayCaminhosDosArquivosUtilizados['nameSpaces']['internos'], &$arrayCaminhosDosArquivosUtilizados['nameSpaces']['externos'], array($nameSpace => array('local' => &$caminho, 'tipo' => 'class')), &$arrayDependencias);
 		//$arrayTempNameSpacesChecados =& array_intersect_key(&$arrayTempDiretorios, &$arrayNameSpacesChecados);
		$cArrayNameSpacesChecados =& count(&$arrayNameSpacesChecados);
		$idx = 0;
		\Core\Uses\Dump($arrayTempDiretorios);
		\Core\Uses\Dump($arrayDependencias);
		exit();

		foreach($arrayNameSpacesChecados as $carregarNameSpace => $tipoDoNameSpace) {

			if(!class_exists($carregarNameSpace) || !interface_exists($carregarNameSpace)) {

				if($idx < ($cArrayNameSpacesChecados - 1) && !array_key_exists(&$carregarNameSpace, &$arrayTempDiretorios)) {

					$auxCaminho =& self::procurarCaminhoDoArquivoNoNameSpace($carregarNameSpace, $tipoDoNameSpace, TRUE);
				}

				else {

					$auxCaminho = $arrayTempDiretorios[$carregarNameSpace]['local'];
				}

				if($idx === ($cArrayNameSpacesChecados - 1) || $caminho !== $auxCaminho) {

					\Core\Uses\IncluirArquivo(&$auxCaminho);
				}
			}

			$idx++;
		}

		unset($arrayTempNameSpacesChecados, $arrayNameSpacesChecados, $arrayTempNameSpacesChecados, $arrayTempDiretorios, $arrayArquivosParaCarregar);
	}

	final public static function &getClasse($path) {

		return self::getObjeto(&$path);
	}

	final public static function &getObjeto($path) {

		//self::$_newClasseAtivo = TRUE;
		extract(self::_construirConfigDoCaminho(&$path), EXTR_REFS & EXTR_OVERWRITE);

		if($totalParams > 1) {

			try {

				if(self::$_arrayInstancias[$idClasse] === NULL) {

					 self::_incluirRecursivamenteArquivosDeClassesOuInterfacesExternas($caminho, $nameSpace, TRUE);
				}
			}

			catch(\Exception $e) {

				if(empty($auxCaminho)) {

					$auxCaminho = $caminho;
				}

				if(!strpos(&$carregarNameSpace, T_NS_SEPARATOR)) {

					$carregarNameSpace = 'Namespace em formato inválido.';
				}

				echo 'Falha ao incluir o arquivo: '.$auxCaminho.'<br>'.'Namespace não incluído e não carregado: '.$carregarNameSpace.'<br>'.'Erro interno do php: '.$e->getMessage();
				exit();
			}
		}

		$clsSing = self::$_arrayPropriedadesPadraoDasInstancias[$idClasse]['propriedades']['classeSingleton'];
		$totalParams =& count(&self::$_arrayParams);

		if($clsSing === NULL) {

			$clsSing = self::$_classeSingleton;

			if($clsSing === NULL) {

				$clsSing = self::$classeSingleton;
			}
		}

		$init =& self::carregarInstancia(array('retorno' => 'reflexao', 'reflexao' => TRUE, 'classeSingleton' => &$clsSing, 'classe' => &$nameSpace, 'idClasse' => &$idClasse));

		if(method_exists(&$nameSpace, '__construct') || $totalParams) {

			if($totalParams) {

				$arrayParams =& self::$_arrayParams;

				try {

					$arrayParamsReflection =& $init->getMethod('__construct')->getParameters();

					if(!count(&$arrayParamsReflection)) {

						echo 'Construtor nao possui parametros ou nao existe';
						exit();
					}

					$arrayNewParams = array();

					foreach($arrayParamsReflection as $i => $param) {

						if($param->isPassedByReference()) {

							$arrayNewParams[$i] =& $arrayParams[$i];
						}

						else {

							$arrayNewParams[$i] = $arrayParams[$i];
						}
					}
				}

				catch(\Exception $e) {

					echo 'Construtor nao possui parametros ou nao existe';
					exit();
				}

				$reflection =& self::carregarInstancia(array('retorno' => TRUE, 'classeSingleton' => &$clsSing, 'arrayParams' => &$arrayNewParams, 'classe' => &$nameSpace, 'idClasse' => &$idClasse));
				unset($init, $arrayParamsReflection, $arrayNewParams);
				self::$_classeSingleton = self::$_arrayParams = self::$_arrayConfigClasseInstanciada = NULL;			
				return $reflection;
			}

			else {

				$reflection =& self::carregarInstancia(array('retorno' => TRUE, 'classeSingleton' => &$clsSing, 'arrayParams' => TRUE, 'classe' => &$nameSpace, 'idClasse' => &$idClasse));
				unset($init);
				self::$_classeSingleton = self::$_arrayConfigClasseInstanciada = NULL;
				return $reflection;
			}
		}

		else {

			$reflection =& self::carregarInstancia(array('retorno' => TRUE, 'classeSingleton' => &$clsSing, 'classe' => &$nameSpace, 'idClasse' => &$idClasse));
			unset($init);
			self::$_classeSingleton = self::$_arrayConfigClasseInstanciada = NULL;
			return $reflection;
		}
	}

	public static function classs($path) {
$this->new->getClasse();
		$aux =& get_included_files();

		if($aux[$path] === NULL) {

			include($path);
		}
	}
}
?>